﻿// 1403 [CF 701C] They Are Everywhere.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>


using namespace std;
/*
http://oj.daimayuan.top/course/22/problem/1092

给你一个长度为 n 的字符串，字符串由大小写英文字母组成。

你需要求出一个长度最短的子串，使得子串中包含了字符串中所有字符。

请输出满足条件的最短子串的长度。

输入格式
输入第一行一个整数 n。

接下来一行一个长度为 n 的字符串 s。

输出格式
输出一行一个数表示答案。

样例输入1
7
bcAAcbc
样例输出1
3
样例输入2
6
aaBCCe
样例输出2
5
数据范围
对于 100%的数据，保证 1≤n≤105。
*/

int orihash[52];
int currhash[52];
const int N = 100010;
char str[N];

int n;

int IsEqual(int a[], int b[]) {
	for (int i = 0; i < 52; i++) {
		if (a[i]  != 0 && b[i] == 0) return false;
		else if (a[i] == 0 && b[i] != 0) return false;
	}
	return true;
}

int main()
{
	scanf("%d %s", &n, str);
	int elenum = 0;
	for (int i = 0; i < n; i++) {
		if (str[i] >= 'A' && str[i] <='Z') {
			orihash[str[i] - 'A' +26] = 1;
		}
		else if (str[i] >= 'a' && str[i] <= 'z') {
			orihash[str[i] - 'a'] = 1;
		}
	}

	int l = 0; int r = 0;
	if (str[0] >= 'A' && str[0] <= 'Z') {
		currhash[str[0] - 'A' + 26] = 1;
	}
	else if (str[0] >= 'a' && str[0] <= 'z') {
		currhash[str[0] - 'a'] = 1;
	}

	int ans = 999999999;
	while (l < n && r < n) {
		if (IsEqual(currhash, orihash)) {
			ans = min(ans, r - l + 1);
			if (str[l] >= 'A' && str[l] <= 'Z') {
				currhash[str[l] - 'A' + 26] -= 1;
			}
			else if (str[l] >= 'a' && str[l] <= 'z') {
				currhash[str[l] - 'a'] -= 1;
			}
			l++;
		}
		else {
			r++;
			if (str[r] >= 'A' && str[r] <= 'Z') {
				currhash[str[r] - 'A' + 26] += 1;
			}
			else if (str[r] >= 'a' && str[r] <= 'z') {
				currhash[str[r] - 'a'] += 1;
			}
		}
	}

	printf("%d\n",ans);

	return 0;
}

 